package szoftlab4;

import java.util.ArrayList;
import java.io.*;

/**
 * Loggoló osztály, amelynek feladata a metódushívások kiíratása és az objektumok
 * nyomon követése.
 * @author Peti
 */
public class Logger
{

    private static ArrayList<Object> objektumok = new ArrayList<Object>();
    private static int melyseg = 0;
    private static boolean engedelyezve = true;
    private static final String behuzas = "    ";

    /**
     * A Logger állapotát kapcsolja át engedélyezettre vagy nem engedélyezettre.
     * Ha nincs engedélyezve, nem történik kiíratás.
     *
     * @param b
     */
    public static void engedelyezve(boolean b)
    {
        engedelyezve = b;
    }

    /**
     * A loggoló metódus. Kiírja a képernyőre az adott hívás típusát, az objektum
     * sorszámát(amit ő maga rendel hozzá az objektumokhoz), az objektum osztályának
     * nevét és a metódus nevét, amely meghívta. A kiírás rendezett, behúzásos
     * formában történik. Csak akkor történik kiírás, ha engedélyezve van.
     *
     * @param melyik
     * A loggolást kezdeményező objektum. Mindig this-t kell átadni.
     *
     * @param tipus
     * A hívás típusa, amely lehet HivasTipus.Call, HivasTipus.Create, vagy
     * HivasTipus.Return.
     *
     * @param osztaly
     * Az objektum osztályának a neve, ahol a metódus megtalálható.
     *
     * @param metodus
     * A meghívó metódus neve.
     *
     */
    public static void log(Object melyik, HivasTipus tipus, String osztaly, String metodus)
    {
        if (!objektumok.contains(melyik))
        {
            objektumok.add(melyik);
        }
        
        if (engedelyezve)
        {

            if (tipus == HivasTipus.Create)
            {
                for (int i = 0; i < melyseg; i++)
                {
                    System.out.print(behuzas);
                }
                System.out.println("CREATE | #"
                        + objektumok.indexOf(melyik)
                        + ": " + osztaly + " | "
                        + metodus);
                melyseg++;
            }

            if (tipus == HivasTipus.Call)
            {
                for (int i = 0; i < melyseg; i++)
                {
                    System.out.print(behuzas);
                }
                System.out.println("CALL | #"
                        + objektumok.indexOf(melyik)
                        + ": " + osztaly + " | "
                        + metodus);
                melyseg++;
            }

            if (tipus == HivasTipus.Return)
            {
                for (int i = 0; i < melyseg - 1; i++)
                {
                    System.out.print(behuzas);
                }
                System.out.println("RETURN | #"
                        + objektumok.indexOf(melyik)
                        + ": " + osztaly + " | "
                        + metodus);
                melyseg--;
            }
        }
    }

    /**
     * Egy eldöntendő kérdést vár bemenetként String formában. Kiírja a Stringet,
     * és választ vár rá. Ha a válasz "igen", kis-és nagybetűtől függetlenül,
     * akkor true értékkel tér vissza, egyébként false értékkel.
     *
     * @param kerdes
     * Az eldöntendő kérdés.
     *
     * @return
     * True, ha igen a válasz, egyébként false.
     *
     * @throws IOException
     */
    public static boolean igenloValasz(String kerdes) throws IOException
    {
        for (int i = 0; i < melyseg; i++)
        {
            System.out.print(behuzas);
        }
        System.out.println(kerdes);
        for (int i = 0; i < melyseg; i++)
        {
            System.out.print(behuzas);
        }
        InputStreamReader inp = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(inp);
        String str = br.readLine();
        if (str.compareToIgnoreCase("igen") == 0)
        {
            return true;
        }
        return false;
    }

    /**
     * Egy objektum sorszámára irányuló kérdést vár. Kiírja a kérdést, majd
     * visszatér az adott sorszámú objektummal. Nincs ellenőrizve a beírt szám,
     * úgyhogy figyelni kell a helyes érték megadására.
     *
     * @param kerdes
     * A számra irányuló kérdés.
     *
     * @return
     * A megadott sorszámú objektum.
     *
     * @throws IOException
     */
    public static Object objektumvalasztas(String kerdes) throws IOException
    {
        for (int i = 0; i < melyseg; i++)
        {
            System.out.print(behuzas);
        }
        System.out.println(kerdes);
        for (int i = 0; i < melyseg; i++)
        {
            System.out.print(behuzas);
        }
        InputStreamReader inp = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(inp);
        String str = br.readLine();
        int i = Integer.parseInt(str);
        return objektumok.get(i);
    }
}
